package it.luigiarpino.kernighanLin;

/**
 * 
 * @author Luigi Lorenzo Arpino [luigiarpino@yahoo.it]
 *
 */
public class KPartitioningBest
{
	
	private int[] partizionamento;
	private int costo;
	private int costoMaxTaglio;
	
	public KPartitioningBest(int[][] matrice, int k)
	{
		boolean isFisrtCycle=true;
		costo =0;
		//for (int i=0; i< 10; i++)
		for (int i=0; i< 1; i++)
		{
			KPartitioning kpart=new KPartitioning(matrice,k);
			int costoAttuale=kpart.getCosto();
			if (isFisrtCycle || costoAttuale<costo)
			{
				isFisrtCycle=false;
				this.costo=costoAttuale;
				this.partizionamento=kpart.getPartizionamento();
				this.costoMaxTaglio=kpart.getCostoMaxTaglio();
			}
		}
	}
	
	public int[] getPartizionamento()
	{
		return this.partizionamento;
	}
	
	
	
	public static void main(String args[])
	{
		/*
		int[][] matrix={
			    //   0  1  2  3  4  5  6  7
					{0, 0, 1, 0, 0, 0, 0, 0 },// 0
					{0, 0, 1, 0, 0, 0, 0, 0 },// 1
					{1, 1, 0, 1, 1, 0, 0, 0 },// 2
					{0, 0, 1, 0, 0, 0, 0, 0 },// 3
					{0, 0, 1, 0, 0, 1, 1, 1 },// 4
					{0, 0, 0, 0, 1, 0, 0, 0 },// 5
					{0, 0, 0, 0, 1, 0, 0, 0 },// 6
					{0, 0, 0, 0, 1, 0, 0, 0 },// 7
			};
		*/
		int[][] matrix={
			    //   0  1  2  3  4  5  6  7  8
					{0, 0, 0, 1, 0, 0, 0, 0, 1 },// 0
					{0, 0, 0, 0, 1, 0, 1, 1, 1 },// 1
					{0, 0, 0, 0, 0, 1, 1, 0, 0 },// 2
					{1, 0, 0, 0, 0, 0, 0, 0, 1 },// 3
					{0, 1, 0, 0, 0, 0, 0, 1, 0 },// 4
					{0, 0, 1, 0, 0, 0, 1, 0, 0 },// 5
					{0, 1, 1, 0, 0, 1, 0, 0, 1 },// 6
					{0, 1, 0, 0, 1, 0, 0, 0, 0 },// 7
					{1, 1, 0, 1, 0, 0, 1, 0, 0 },// 8
			};
		
		//KPartitioning kp=new KPartitioning(matrix,4);
		KPartitioningBest kp=new KPartitioningBest(matrix,3);
		int[] partizionamento=kp.getPartizionamento();
		int costo = kp.getCosto();
		System.out.println();
		System.out.println("Costo="+costo);
		System.out.println();
		System.out.println("Partizionamento");
		for(int i=0; i< partizionamento.length ; i++)
	    {
			System.out.print(" "+partizionamento[i]);
	    }
		
		
	}

	public int getCostoMaxTaglio()
	{
		return this.costoMaxTaglio;
	}
	
	public int getCosto() 
	{
		return this.costo;
	}
}
